package com.spider.silence.task.manager;

import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
import com.spider.silence.task.Task;

import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * Created by 夏茂轩 on 2016/12/26.
 */
public class CommonTaskManager {

    protected static Map<String,BlockingQueue<Task>>  taskQueueMap= Maps.newConcurrentMap();

    /**
     * @author 夏茂轩
     * @date 2017/1/15 22:31
     * @description 添加一个任务,阻塞方法
     * @param taskName 任务类型名称
     * @param task 具体的任务
     * @throws InterruptedException
     */
    public static void add(String taskName,Task task) throws InterruptedException {
        BlockingQueue<Task> taskQueue =  taskQueueMap.get(taskName);
        if(taskQueue==null){
            taskQueue=Queues.newLinkedBlockingQueue();
            System.out.println("taskQueueMap的大小:"+taskQueueMap.size()+"-----put:"+taskName+"-"+taskQueue.size());
            taskQueue.put(task);
            taskQueueMap.put(taskName,taskQueue);
        }else{
            System.out.println("taskQueueMap的大小:"+taskQueueMap.size()+"-----put:"+taskName+"-"+taskQueue.size());
            taskQueue.put(task);
        }
    }



    /**
     * @author 夏茂轩
     * @date 2017/1/15 22:31
     * @description 获取一个任务,阻塞方法
     * @param taskName 任务类型名称
     * @return Task
     * @throws InterruptedException 中断异常
     */
    public static Task take(String taskName) throws InterruptedException {
        BlockingQueue<Task> taskQueue =  taskQueueMap.get(taskName);
        if(taskQueue==null){
            taskQueue=Queues.newLinkedBlockingQueue();
            taskQueueMap.put(taskName,taskQueue);
        }
        if(taskQueue.size()>0){
            System.out.println("take:"+taskName+"-"+taskQueue.size());
        }
        return taskQueue.take();
    }

    /**
     * @author 夏茂轩
     * @date 2017/1/15 22:32
     * @description 添加一个任务
     * @param taskName 任务类型名称
     * @param task 具体的任务
     * @param mills 添加超时
     * @throws InterruptedException 中断异常
     */
    public static   void addTask(String taskName,Task task,long mills) throws InterruptedException {
        BlockingQueue<Task> taskQueue =  taskQueueMap.get(taskName);
        if(taskQueue==null){
            taskQueue=Queues.newLinkedBlockingQueue();
            System.out.println("put:"+taskName+"-"+taskQueue.size());
            taskQueue.offer(task,mills, TimeUnit.MILLISECONDS);
            taskQueueMap.put(taskName,taskQueue);
        }else{
            System.out.println("put:"+taskName+"-"+taskQueue.size());
            taskQueue.offer(task,mills, TimeUnit.MILLISECONDS);
        }
    }

    /**
     * @author 夏茂轩
     * @date 2017/1/15 22:33
     * @description 获取一个任务,非阻塞方法
     * @param taskName 任务类型名称
     * @param mills 获取超时
     * @return Task
     * @throws InterruptedException 中断异常
     */
    public static Task takeTask(String  taskName,long mills) throws InterruptedException {
        BlockingQueue<Task> taskQueue =  taskQueueMap.get(taskName);
        if(taskQueue==null){
            taskQueue=Queues.newLinkedBlockingQueue();
            taskQueueMap.put(taskName,taskQueue);
        }
        if(taskQueue.size()>0){
            System.out.println("taskQueueMap的大小:"+taskQueueMap.size()+"-----take:"+taskName+"-"+taskQueue.size());
        }
        return  taskQueue.poll(mills,TimeUnit.MILLISECONDS);
    }
}
